﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DemoNHibernate.DAO;
using NHibernate;
using DemoNHibernate.Domain;

//****************************************************************************************************************************************************************
//****************************************************************************************************************************************************************
//****************************************************************************************************************************************************************

	//MISE EN PLACE DE L'ORM NHIBERNATE

	//- Télécharger ZIP NHibernate contenant ses DLL
	//- Création d'un répertoire "Libs" à la racine du projet et ajouter les fichiers 	
	//	- NHibernate.dll (ZIP NHibernate)
	//	- Iesi.Collections.dll (ZIP NHibernate)
	//	- log4net.dll (ZIP NHibernate)	
	//	- nhibernate-configuration.xsd (ZIP NHibernate)	
	//	- nhibernate-mapping.xsd (ZIP NHibernate)	
	//	- log4net.xsd (trouvé sur internet)
	//- Ajouter les dlld en tant que référence du projet
	//	- NHibernate.dll
	//	- log4net.dll
	//	- System.Data.SqlServerCe (pour travailler sur une base SQL Server CE)

	//- Définir "Copie locale" à true dans les propriétés de la dll System.Data.SqlServerCe
	//	Cela permettra de copier la dll dans le répertoire de compil où on en aura besoin

	//- Créer un fichier App.config (par "Add new item" et "Application Configuration File")
	//- Définir "Contenu" pour "Application de génération" et "Toujours copier" dans "Copie dans le répertoire de sortie"
	//- Ajouter les schémas (xsd) nhibernate-configuration et log4net dans les propriétés du fichier App.config

	//- Créer une base locale (sdf)(SQL Server Lite)
	//- Définir "Copie locale" à true dans les propriétés de la base

	//- Créer classe métier, ex : Cotisation (pensez à définir les fonctions virtual)
	//- Créer un fichier xml de mapping de la classe métier : Cotisation.hbm.xml
	//- Définir "Resource incorporée" dans "Action générée" dans les propriétés du fichier xml

	//- Créer une classe "Repository" pour définir les opération de CRUD sur les classes métiers
	//- Créer une classe static NHibernateHelper pour gérer les création et ouverture de session

	//Sources : 
	//	http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx
	//	http://tahe.developpez.com/dotnet/nhibernate/?page=page_2#LI-E-2

//****************************************************************************************************************************************************************
//****************************************************************************************************************************************************************
//****************************************************************************************************************************************************************


namespace DemoNHibernate
{
	class Program
	{
		static void Main(string[] args)
		{
			NHibernateHelper.OpenSession();
			try 
			{ 
				Console.WriteLine("Affichage base -------------------------------------"); 
				ShowDataBase(); 
				Console.WriteLine("Effacement base -------------------------------------"); 
				ClearDataBase(); 
				Console.WriteLine("Affichage base -------------------------------------"); 
				ShowDataBase(); 
				Console.WriteLine("Remplissage base -------------------------------------"); 
				FillDataBase(); 
				Console.WriteLine("Affichage base -------------------------------------"); 
				ShowDataBase(); 				
			} 
			catch (Exception ex) 
			{ 
				// on affiche l'exception  
				Console.WriteLine(string.Format("L'erreur suivante s'est produite : [{0}]", ex.ToString())); 
			} 
			finally 
			{ 				
				NHibernateHelper.CloseSession();
			} 
			// attente clavier 
			Console.ReadLine(); 
		}

		static void ShowDataBase() 
		{ 
			// on récupère la liste des employés 
			//IList<Employe> employes = session.CreateQuery(@"select e from Employe e order by e.Nom asc").List<Employe>(); 
			IList<Employe> employes = Repository<Employe>.GetList();
			// on l'affiche 
			Console.WriteLine("--------------- liste des employés"); 
			foreach (Employe e in employes) 
			{ 
				Console.WriteLine(e); 
			} 
			// on récupère la liste des indemnites 
			//IList<Indemnites> indemnites = session.CreateQuery(@"select i from Indemnites i order by i.Indice asc").List<Indemnites>(); 
			IList<Indemnites> indemnites = (IList<Indemnites>)Repository<Indemnites>.ApplySQL(@"select i from Indemnites i order by i.Indice asc", true);
			// on l'affiche 
			Console.WriteLine("--------------- liste des indemnités"); 
			foreach (Indemnites i in indemnites) 
			{ 
				Console.WriteLine(i); 
			} 
			// on récupère la liste des cotisations 
			//Cotisations cotisations = session.CreateQuery(@"select c from Cotisations c").UniqueResult<Cotisations>(); 
			Cotisations cotisations = Repository<Cotisations>.GetUnique();
			Console.WriteLine("--------------- tableau des taux de cotisations"); 
			Console.WriteLine(cotisations);					
		}

		// FillDataBase 
		static void FillDataBase() 
		{ 			
			// on crée deux indemnités 
			Indemnites i1 = new Indemnites() { Id = Guid.NewGuid(), Indice = 1, BaseHeure = 1.93, EntretienJour = 2, RepasJour = 3, IndemnitesCp = 12 }; 
			Indemnites i2 = new Indemnites() { Id = Guid.NewGuid(), Indice = 2, BaseHeure = 2.1, EntretienJour = 2.1, RepasJour = 3.1, IndemnitesCp = 15 }; 
			Repository<Indemnites>.Add(i1);
			Repository<Indemnites>.Add(i2);
			// on crée deux employés
			Employe e1 = new Employe() { Id = Guid.NewGuid(), SS = "254104940426058", Nom = "Jouveinal", Prenom = "Marie", Adresse = "5 rue des oiseaux", Ville = "St Corentin", CodePostal = "49203", Indemnites = i1 }; 
			Employe e2 = new Employe() { Id = Guid.NewGuid(), SS = "260124402111742", Nom = "Laverti", Prenom = "Justine", Adresse = "La Brûlerie", Ville = "St Marcel", CodePostal = "49014", Indemnites = i2 };
			Repository<Employe>.Add(e1);
			Repository<Employe>.Add(e2);
			// on crée les taux de cotisations 
			Cotisations cotisations = new Cotisations() { Id = Guid.NewGuid(), CsgRds = 3.49, Csgd = 6.15, Secu = 9.39, Retraite = 7.88 };
			Repository<Cotisations>.Add(cotisations);
		}

		// ClearDataBase
		static void ClearDataBase() 
		{ 
			// on récupère la liste des employés 
			IList<Employe> employes = Repository<Employe>.GetList();
			// on supprime tous les employés 
			Console.WriteLine("--------------- suppression des employés associés"); 
			Repository<Employe>.Remove(employes);			
			// on récupère la liste des indemnités 
			//IList<Indemnites> indemnites = session.CreateQuery(@"select i from Indemnites i").List<Indemnites>(); 
			IList<Indemnites> indemnites = Repository<Indemnites>.GetList();
			// on supprime les indemnités 
			Console.WriteLine("--------------- suppression des indemnités"); 
			Repository<Indemnites>.Remove(indemnites);	
			// on récupère la liste des cotisations 
			//Cotisations cotisations = session.CreateQuery(@"select c from Cotisations c").UniqueResult<Cotisations>(); 
			Cotisations cotisations = Repository<Cotisations>.GetUnique();
			Console.WriteLine("--------------- suppression des taux de cotisations"); 
			Repository<Cotisations>.Remove(cotisations);			
		} 
    } 
}
